iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
自我挑戰組

打掉重練!Django的還債之旅~系列 第 13

Day13. migrate 資料庫遷移?

  • 分享至 

  • xImage
  •  

前言

直到昨天我們才第一次對資料庫下migrate,什麼是migrate?而migrate又是會做什麼事呢?django的migrate指令會根據我們寫的一些檔案生成對應的SQL後對資料庫進行操作,而具體的檔案會是由makemigrations生成,django會根據migrations資料夾內的檔案對我們自己撰寫的table也就是models.py做版控,而一開始的migrate會根據django預設migrations內的檔案做驗證確認後才寫進資料庫!聽起來不容易呢,有很多細微的操作!接著就讓我們潛下去python manage.py migrate來看看細部的內容吧~

正題

老熟了,我們就到django.core.management.commands中找到對應的檔案吧!不過以防萬一我們還是驗證一下是不是真的是這個位置!<django.core.management.commands.migrate.Command object at 0x000001C327463D50>沒問題是對的!
https://ithelp.ithome.com.tw/upload/images/20230928/20162905kM2H8mtq1a.png
https://ithelp.ithome.com.tw/upload/images/20230928/20162905z0Qmyj9Hfy.png
這個原始碼的長度看了一下就知道大事不妙了!需要慢慢拆解來看~那就邊看註解邊讀原始碼吧!
首先看到的是
https://ithelp.ithome.com.tw/upload/images/20230928/2016290577vRgZ4pm3.png
這邊說實際的我沒有很清楚這樣做的目的,看註解是把所有相關的app.management import進來,為了處理events?可能需要再詳細研究看看~
接著是
https://ithelp.ithome.com.tw/upload/images/20230928/20162905Ek9oaISXG1.png
先來看看connections是怎麼來的吧!
https://ithelp.ithome.com.tw/upload/images/20230928/201629054YJQfbc4VA.png
繼續挖
https://ithelp.ithome.com.tw/upload/images/20230928/20162905VYgyMdhqKT.png
https://ithelp.ithome.com.tw/upload/images/20230928/20162905tk5PcV1XAz.png
上次有介紹過的magic method,這邊是用在BaseConnectionHandler中的__getitem__這個magic method來處理
https://ithelp.ithome.com.tw/upload/images/20230928/20162905NJpRv1ZdQW.png
可以看到他會去create一個connection我們在往裡面看,create_connection()要回到ConnectionHandler來看
https://ithelp.ithome.com.tw/upload/images/20230928/20162905juxmXeVzgY.png
此時這邊會根據我們在settings設定的DATABASEDS中的ENGINE去找到相對應的db,然後回傳該DB的DatabaseWrapper物件,我們再接著看一下DatabaseWrapper是什麼?那因為我是用預設的sqlite,我們就根據load_backend()這個線索找到sqlite的資料夾放在哪~
https://ithelp.ithome.com.tw/upload/images/20230928/20162905VJJBUsvcNK.png
django.db.backends.sqlite3.base
https://ithelp.ithome.com.tw/upload/images/20230928/20162905ftEOSmbZC1.png
之後我們在前面migrate的時候使用的connection就可以知道他會是sqlite中的DatabaseWrapper囉!
接著我們在回到migrate的下面一個
https://ithelp.ithome.com.tw/upload/images/20230928/20162905Sp0yuGO0Fo.png
根據剛剛的結果我們可以知道他會是DatabaseWrapper的function
https://ithelp.ithome.com.tw/upload/images/20230928/20162905Sd6TLEMVZ5.png
這個我自己看了看他是沒有被使用到的,具體有沒有做其他我不清楚的操作不確定!
今天大概就先到這邊~明天就從這裡開始接續~
https://ithelp.ithome.com.tw/upload/images/20230928/20162905tfP7hPgWQ3.png

結語

migrate會碰到資料庫的地方也是我一直很好奇的部分,到底django的orm是怎麼跟database做溝通的呢!?藉由這次機會就來好好的研究研究,剛好明天中秋節放假,可以有很多時間來探明django與database之間的橋樑!!


上一篇
Day12. 超級使用者 Super User
下一篇
Day14. django與database的橋樑~
系列文
打掉重練!Django的還債之旅~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言